package proxy.dynamic;

import java.lang.reflect.Proxy;

// 代理类
class ProxyFactory {
    // 接收一个目标对象
    private Object target;

    ProxyFactory(Object target) {
        this.target = target;
    }

    // 返回对目标对象(target)代理后的对象(proxy)
    Object getProxyInstance() {
        // 执行代理对象方法时候触发
        return Proxy.newProxyInstance(
            target.getClass().getClassLoader(),  // 目标对象使用的类加载器
            target.getClass().getInterfaces(),   // 目标对象实现的所有接口
            (proxy, method, args) -> {
                // 获取当前执行的方法的方法名
                String methodName = method.getName();
                System.out.println("method: " + methodName);
                // 方法返回值
                Object result;
                if ("find".equals(methodName)) {
                    // 直接调用目标对象方法
                    result = method.invoke(target, args);
                } else {
                    System.out.println("调用前...");
                    // 执行目标对象方法
                    result = method.invoke(target, args);
                    System.out.println("调用后...");
                }
                return result;
            }
        );
    }
}